package org.rkuk.kasutil.test 
{
	import flash.events.Event;
	import flash.events.EventDispatcher;
	import flash.events.IEventDispatcher;
	import org.rkuk.kasutil.designPatternTools.AbstractTool;
	/**
	 * TestCase初始化完成时发出此事件
	 * @eventType	flash.events.Event.INIT
	 */
	[Event(name = "init", type = "flash.events.Event")]
	
	/**
	 * 用于创建需要被测试的类，并执行其相关方法进行测试.
	 * TestCase是抽象类，可以通过在其子类中override initialize方法创建要被测试的类的对象，
	 * 并override run方法执行被测对象的方法实现测试过程。具体的TestCase应该在TestBed的createTestCase方法冲被创建。
	 * @author rkuk
	 * @see		org.rkuk.kasutil.test.TestBed
	 */
	public class TestCase extends EventDispatcher
	{
		private var isInitialized:Boolean = false;
		
		/**
		 * 创建此测试用例的TestBed
		 */
		protected var testBed:TestBed;
		
		/**
		 * 构造函数，应该在TestBed的createTestCase方法中创建TestCase对象
		 * @param	testBed		创建测试用例的TestBed对象
		 * @param	target		TestCase对象发出事件时，事件中的target对象
		 * TestCase发出事件时，可以让事件的target属性不引用到自身而指向别的对象，
		 * 当此参数不为null时，TestCase发出的事件的target属性将指向此处设置的对象。
		 */
		public function TestCase(testBed:TestBed, target:IEventDispatcher = null) 
		{
			AbstractTool.makeAbstractClass(this, TestCase);
			super(target);
			this.testBed = testBed;
		}
		
		/**
		 * 初始化测试用例，此处默认的的初始化过程只是发出Event.INIT事件.
		 * 子类中应override此方法创建被测试的类的对象，之后再发出Event.INIT事件。
		 * 当TestCase发出Event.INIT事件时，TestBed.onTestCaseReady方法会执行。
		 * @see		org.rkuk.kasutil.test.TestBed#onTestCaseReady()
		 */
		public function initialize():void
		{
			if (!isInitialized)
			{
				isInitialized = true;
				dispatchEvent(new Event(Event.INIT));
			}
		}
		
		/**
		 * 运行测试用例.
		 * 子类中应override此方法，调用被测试类的对象的响应方法实现测试。
		 */
		public function run():void
		{
			AbstractTool.makeAbstractMethod(this, "run");
		}
		
		/**
		 * 显示测试信息，默认通过trace方法显示.
		 * 如果需要通过其他调试工具显示信息，可以override此方法。
		 * @param	...contents		待输出显示的测试信息
		 */
		protected function debugTrace(...contents):void
		{
			trace.apply(null,contents);
		}
	}
}